///********************************************************************
///* Copyright © 2011 fishr (fishr.flash@gmail.com)  
///********************************************************************
package su.fishr.effects.prismavision.views 
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.ColorTransform;
	import flash.geom.Matrix;
	
	
   /**
	 *  Наименьший и основной, элементарный, визуальный объект приложения.
	 *	Представляющий собой одну призму.
	 *	Выполняет смену фрагментов изображения имитируя работу призмы билборда.
	 *  Может выполнять смену слева-направо и справа-налево, снизу-вверх и сверху-вниз.
	 *
	 * 
	 * @version                1.0
	 * @playerversion          Flash 9
	 * @langversion            3.0
	 * @author                 fishr
	 * @created                06.08.2011 20:03
	 * @since                  06.08.2011 20:03
	 */
    internal class PrismaFilters extends Prisma
	{
	
	/**-------------------------------------------------------------------------------
	* 
	*	   						V A R I A B L E ' S 	
	* 
	* --------------------------------------------------------------------------------
	*/
	//{
	    static public const AUTHOR:String = "fishr (fishr.flash@gmail.com)";	
		private var _corBrightness:Number;
		private var _factorShadow:Number;
	//}
	
	/**-------------------------------------------------------------------------------
	* 
	*	 						P R O P E R T I E S 	
	* 
	* --------------------------------------------------------------------------------
	*/
	//{
		public function set corrBrightness(value:Number):void 
		{
			_corBrightness = value;
		}
		
		public function set factorShadow(value:Number):void 
		{
			_factorShadow = value;
		}

	//}
	/**-------------------------------------------------------------------------------
	* 
	*								P U B L I C 	
	* 
	* --------------------------------------------------------------------------------
	*/
	//{
		public function PrismaFilters(obj:Bitmap, mask:Bitmap)
		{
			super(obj, mask);
		}
		
		
		
		///сменяющее изображение
		override public function secPict(secPict:Bitmap, secMask:Bitmap = null):void 
		{
			super.secPict( secPict );
			super.secCont.removeChildAt( 0 );
			super.secCont.addChild( secMask );

		}
		
		override public function rotationPrisma( rotatParams:Array, vertical:Boolean = false):void
		{
			super.rotationPrisma( rotatParams, vertical );
			var shape:Shape;
			var deg:int;
			///косвенно по значениям массива определяем направление вращения
			///влево или вправо
			if ( vertical === false && rotatParams[2][0] < 0 ) deg = 180;
			else if ( vertical === false ) deg = 0;
			else if (vertical === true && rotatParams[2][0] < 0) deg = 270;
			else if ( vertical === true ) deg = 90;
			shape = addGradient( super.prevCont.width, super.prevCont.height, deg );
			super.prevCont.addChild( shape );
			if ( vertical === false && rotatParams[2][0] < 0 ) deg = 0;
			else if ( vertical === false ) deg = 180;
			else if (vertical === true && rotatParams[2][0] < 0) deg = 90;
			else if ( vertical === true ) deg = 270;
			shape = addGradient( super.secCont.width, super.secCont.height, deg );
			super.secCont.addChild( shape );
	
		}
		
		
		
	//}
	
	/**-------------------------------------------------------------------------------
	* 
	*							P R O T E C T E D S
	* 
	* --------------------------------------------------------------------------------
	*/	
	//{
		override protected function init(obj:Bitmap, mask:Bitmap = null):void
		{
			super.init( obj );
			addMaskInit( mask );
		}
		
		override protected function turnPrisma(coords:Array):void 
		{
			super.turnPrisma( coords );
			applyFilters();
			
		}
		
		override protected function turnPrismaV(coords:Array):void 
		{
			super.turnPrismaV( coords );
			applyFilters();
		}
		
		override protected function endRotation():void 
		{
			super.endRotation();
			
			///переносим маску
			super.prevCont.addChild( super.secCont.getChildAt(0) );
			///переносим маску
			super.secCont.addChild( super.prevCont.getChildAt(0) );
			
			///удаляем тень
			super.prevCont.removeChildAt( 0 );
			///удаляем тень
			super.secCont.removeChildAt(0);
			
			super.prevCont.getChildAt( 1 ).alpha = 0;
			super.secCont.getChildAt( 1 ).alpha = 0;
			
			
		}
	//}
	
	/**-------------------------------------------------------------------------------
	* 
	*								P R I V A T E 	
	* 
	* --------------------------------------------------------------------------------
	*/	
	//{

		private function addMaskInit( mask:Bitmap ):void
		{
			 var bitmapMask:Bitmap = super.createBlank();
			 super.secCont.addChild( bitmapMask );
			 super.prevCont.addChild( mask );
			 mask.alpha = 0;
		}
		
		private function applyFilters():void
		{
			///отражает текущую фазу исполнения
			var deg:Number = ( super.nmParams / super.rotatParams.length );
			///интесивность затенения и высветления цвета
			
			var increasIntens:Number = deg ;
			var decreaseIntens:Number = 1 - deg;
			var decColor:Number = decreaseIntens *  _corBrightness > 1? 1: decreaseIntens * _corBrightness ;
			var incColor:Number = increasIntens * _corBrightness > 1? 1: increasIntens * _corBrightness ;
			var factorAlphaMask:Number = 3;
			
			super.prevCont.getChildAt(1).transform.colorTransform = new ColorTransform( decColor, 
																					decColor, 
																					decColor, 
																					increasIntens * factorAlphaMask);
			super.secCont.getChildAt(1).transform.colorTransform = new ColorTransform( incColor, 
																					incColor, 
																					incColor, 
																					decreaseIntens * factorAlphaMask);
			
			super.prevCont.getChildAt( 2 ).alpha = increasIntens * _factorShadow > 1? 1:increasIntens * _factorShadow ;
			super.secCont.getChildAt( 2 ).alpha = decreaseIntens * _factorShadow > 1? 1:decreaseIntens * _factorShadow;
			
			
		}

		
		private function addGradient(wth:Number, hght:Number, deg:int = 0  ):Shape
		{
			var rad:Number = deg * ( Math.PI / 180 );
			var shape:Shape = new Shape();
			var colors:Array = new Array( 0x000000, 0x000000);
			var alphas:Array = new Array( .6,  1 );
			var ratios:Array = new Array( 0,  255);
			var matrix:Matrix = new Matrix();
			matrix.createGradientBox( wth, hght, rad);
			shape.graphics.beginGradientFill( "linear", colors, alphas, ratios, matrix);
			shape.graphics.drawRect( 0, 0, wth, hght );
			shape.graphics.endFill();
			shape.alpha = 0;
			return shape;
			
		}
		
		
		
	
	//}

	}

}